package cn.com.header.zbpk.account.mapper;

import cn.com.header.core.IPage;
import cn.com.header.core.ISort;
import cn.com.header.zbpk.account.entity.User;
import cn.com.header.zbpk.account.model.UserExtend;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Set;

/**
 * @author luohaidian
 * @date 2017-11-14
 * @time 09:39
 */
@Mapper
@Repository
public interface IUserMapper {

    /**
     * 查询用户信息
     * @param user 用户模型
     * @param fields 查询属性
     * @param sortSet 排序器
     * @param page 分页
     * @param keyword 模糊搜索条件
     * @return
     */
    List<User> loads(
            @Param("user") User user,
            @Param("fields") Set<String> fields,
            @Param("sorts") Set<ISort> sortSet,
            @Param("page") IPage page,
            @Param("keyword") String keyword
    );

    /**
     * 定制获取用户列表（返回的属性字段涉及到其他对象）
     * @param user              筛选模板
     * @param sortSet           排序集
     * @param page              分页集
     * @return                  复合筛选条件的角色列表
     */
    List<UserExtend> customLoads(
            @Param("user") User user,
            @Param("fields") Set<String> fields,
            @Param("sorts") Set<ISort> sortSet,
            @Param("page") IPage page,
            @Param("keyword") String keyword
    );

    List<UserExtend> loadsByRoleId(
            @Param("roleId") Long roleId,
            @Param("groupId") Long groupId,
            @Param("enabled") boolean enabled,
            @Param("schoolId") Long schoolId,
            @Param("fields") Set<String> fields,
            @Param("sorts") Set<ISort> sortSet,
            @Param("page") IPage page,
            @Param("keyword") String keyword
    );

    /**
     * 查询用户记录数
     * @param user 用户模型
     * @return
     */
    int loadCount(
            @Param("user") User user,
            @Param("keyword") String keyword
    );

    /**
     * 查询用户记录数(按角色/组别)
     * @param enabled
     * @param roleId
     * @param groupId
     * @param keyword
     * @param schoolId
     * @return
     */
    int loadCountBy(
            @Param("enabled") boolean enabled,
            @Param("roleId") Long roleId,
            @Param("groupId") Long groupId,
            @Param("keyword") String keyword,
            @Param("schoolId") Long schoolId
    );

    /**
     * 根据用户id查询
     * @param id 用户id
     * @param fields 查询属性
     * @return
     */
    User loadByPK(
            @Param("id") Long id,
            @Param("fields") Set<String> fields
    );

    /**
     * 新增用户
     * @param user 用户模型
     * @return
     */
    int insert(@Param("user") User user);

    /**
     * 编辑用户信息
     * @param user 用户模型
     * @return
     */
    int update(@Param("user") User user);

    /**
     * 多Id查询用户信息
     * @param  ids id集合
     * @param fields 查询字段集合
     * @return
     */
    List<User> loadByPKs(
            @Param("ids") Set<Long> ids,
            @Param("fields") Set<String> fields
    );







}
